import smtplib
from email.mime.text import MIMEText # 正文文本
from email.mime.multipart import MIMEMultipart
from email.header import Header
import traceback
import sys
import os

from src.log import Log
from src.config import Config



user = Config.SMTPLoginName # SMTP服务器登录名
password = Config.SMTPLoginPasswd  # SMTP服务器登录密码
sender_address = Config.senderAddress # 发件地址
receivers = Config.receiversAddress # 收件地址
smtp_server = Config.SMTPServerAddress # SMTP服务器地址
smtp_port = Config.SMTPPort # SMTP服务器地址端口


# # html内容
# html_msg = """
#     <html>
#         ...
#     <html/>
# """

def exit(errmsg):
    Log().getLogger.error(errmsg)
    os.system('pause')
    sys.exit(0)


def sendEmail(path):

    attch_file = [
        {'path': path, 'name': os.path.basename(path)},
    ]# 添加多个附件

    message = MIMEMultipart() # 创建一个带附件的实例
    # 下面三个为邮件发送时显示的发件人、收件人和邮件主题
    message['From'] = sender_address # 发件地址
    message['To'] = ",".join(receivers) # 收件地址 字符串 多个地址用逗号隔开
    message['Subject'] = Header(Config.emailTitle, 'utf-8') # 邮件主题
    # 三个参数：第一个为文本内容，第二个 plain 设置文本格式，第三个 utf-8 设置编码
    message.attach(MIMEText(Config.emailText, 'plain', 'utf-8')) # 正文内容 普通文本
    # message.attach(MIMEText(html_msg, 'html', 'utf-8')) # 正文内容 Html格式

    # 构造附件
    if attch_file:
        for item in attch_file:
            att = MIMEText(open(item['path'], 'rb').read(), 'base64', 'utf-8') # 创建二进制流
            att["Content-Type"] = 'application/octet-stream'# Content-Type，内容类型，一般是指网页中存在的Content-Type，用于定义网络文件的类型和网页的编码，决定浏览器将以什么形式、什么编码读取这个文件，这就是经常看到一些Asp网页点击的结果却是下载到的一个文件或一张图片的原因。(引用:http://www.runoob.com/http/http-content-type.html)
            att.add_header('Content-Disposition', 'attachment', filename=('utf-8', '', item['name']))
            message.attach(att) # 添加附件

    # 连接SMTP服务器
    try:
        Log().getLogger.info('开始连接SMTP服务器...')
        smtpObj = smtplib.SMTP(smtp_server, smtp_port) # 这里填写发送邮件的SMTP服务器地址 返回<class 'smtplib.STMP'>
        info_msg = smtpObj.ehlo()#查看是否连接服务器成功 返回一个元祖，第一个元素为应答号 250表示链接SMTP服务器成功
        if info_msg[0] == 250:
            Log().getLogger.info('连接SMTP服务器成功...')
        else:
            exit('连接SMTP服务器失败...\n'+'详细信息:\n'+str(info_msg))
    except:
        exit('连接SMTP服务器失败...\n'+'详细信息:\n'+traceback.format_exc())

    # 开始TLS加密 (587端口)
    smtpObj.starttls() # 使用TLS加密传输必须使用此方法，否则无法登陆

    # 登录SMTP服务器
    try:
        Log().getLogger.info(user+'开始登录SMTP服务器...')
        # 注意： 一般情况下登录地址为邮箱，但不排除非邮箱地址登录的情况。
        login_msg = smtpObj.login(user=user, password=password) # 返回元祖 一个元素应答 235表示成功
        if login_msg[0] == 235:
            Log().getLogger.info(user+'登录SMTP服务器成功...')
        else:
            exit('登录SMTP服务器失败...\n'+'详细信息:\n'+login_msg)
    except:
        exit('登录SMTP服务器失败...\n'+'详细信息:\n'+traceback.format_exc())

    # 发送邮件
    try:
        Log().getLogger.info('开始发送邮件...')
        smtpObj.sendmail(
            from_addr=sender_address,
            to_addrs=receivers,
            msg=message.as_string()
        )
        smtpObj.quit()
        Log().getLogger.info('邮件发送成功...')
    except:
        exit('邮件发送失败，详细信息:\n'+'详细信息:\n'+traceback.format_exc())

if __name__ == "__main__":
    sendEmail()
